問題:
有一個8*8格的棋盤,要在上面放八個皇后而不能互相攻擊到彼此
如下圖一個皇后放下去之後紅線上的格子不能再放皇后
解法:
用遞迴
分成兩個子問題
(1)在任意位置放一個皇后
(2)在攻擊範圍外放另一個皇后
一行一行的看(因為一行頂多放一個
程式碼:
int notdanger(int row,int j,int (*chess)[8]){
int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
//判斷列方向
for(i =0;i<8;i++){
if(*(*(chess2+i)+j) !=0){
flag1 =1;
break;
}
}
//判斷左上方
for(i =row,k=j;i>=0&&k>=0;i--,k--){
if(*(*(chess2+i)+j) !=0){
flag2 =1;
break;
}
}
//判斷右下方
for(i =row,k=j;i<8&&k<8;i++,k++){
if(*(*(chess2+i)+j) !=0){
flag3 =1;
break;
}
}
//判斷右上方
for(i =row,k=j;i>=0&&k<8;i--,k++){
if(*(*(chess2+i)+j) !=0){
flag4 =1;
break;
}
}
//判斷左下方
for(i =row,k=j;i<8&&k>=0;i++,k--){
if(*(*(chess2+i)+j) !=0){
flag5 =1;
break;
}
}
if(flag||flag||flag||flag||flag){
return 0;
}else{
return 1;
}
}
//row:起始行
//a:表示列
//(*chess)[8]:表示指向棋盤每一行的指針
void eightQueen(int row, int a, int (*chess)[8]){
int chess2[8][8],i,j;
for(i =0;i<8;i++)
for(i =0;i<8;i++)
chess2[i][j]=chess[i][j];
if( 8 == row){
printf("%d",count);//第N種情況,總共有92種
for(i =0;i<8;i++){
for(j =0;j<8;j++){
/*結束印出棋盤*/
printf("%d",*(*(chess2+i)+j));
}
printf("\n");
}
printf("\n");
}else{
//判斷位置是否在皇后的攻擊路徑上
//如果沒有危險,就判斷下一行
for(j =0;j<8;j++){
//是否在攻擊路線上
if(notdanger(row,j,chess)){
for(i =0;i<8;i++)
*(*(chess2+row)+j = 0;
*(*(chess2+row)+j = 1;
eightQueen(row +1, a, chess2);
}
}
}
}
int main(){
int chess[8][8], i, j; //棋盤
for(i =0;i<8;i++)
for(j =0;j<8;j++){
chess[i][j]=0;//初始化棋盤
}
eightQueen(0,8,chess);
printf("%d",count);
return 0;
}